home *** CD-ROM | disk | FTP | other *** search
/ Palm Utilities / Palm_Utilities_CD-ROM_2001_2001.iso / files / utils misc / Boxer 0.18 / Boxer018.exe / boxer / PalmBoxer / makedb.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-07-09  |  5.8 KB  |  254 lines

  1. #define IGNORE_STDIO_STUBS
  2. #define __string_h
  3.  
  4. #ifdef OLDGCC
  5.  
  6. #include <Common.h>
  7. #include <System/SysAll.h>
  8. #include <UI/UIAll.h>
  9. #include <Unix/sys_types.h>
  10.  
  11. #else
  12.  
  13. #include <PalmOS.h>
  14. #include <PalmCompatibility.h>
  15. #include <Unix/sys_types.h>
  16.  
  17. #endif
  18.  
  19. #include "stringil.h"
  20. #include "stdio2.h"
  21.  
  22. struct prchead {
  23.   char name[32];                //0-32
  24.   short int attr;               //32-33
  25.   short int vers;               //34-35
  26.   long int cr, md, bkt;         //times 36-47
  27.   long int mn, app, sort;       // zero 48-59 - zero for prcs.
  28.   long int type, crea;          //60-67
  29.   long int uidseed, nxrec;      //68-75 - uidseed rand, nxrec zero;
  30.   short int nrecs;              //76-78
  31. } head;
  32.  
  33. struct rsrcdbent {
  34.   long int rsrc;
  35.   short int rsid;
  36.   long int ofst;                //80+10*(nrecs+index)
  37. } rsrcent, rsrcnxt;
  38.  
  39. struct normdbent {
  40.   long int ofst, uid;           //80+8*(nrecs+index)
  41. } dataent, datanxt;
  42.  
  43. int MakeDatabase(FILE * fd, int destruct)
  44. {
  45.   FILE *tfd;
  46.   LocalID lid, aiid, siid;
  47.   int i;
  48.   UInt16 cardno = 0;
  49.   UInt16 num, attr;
  50.   UInt32 uid, asz, ssz, ofst, count, total;
  51.   DmOpenRef db;
  52.   void *ap;
  53.   char buf[8];
  54.   RectangleType r;
  55.  
  56.   r.topLeft.x = 0, r.topLeft.y = 15, r.extent.x = 160, r.extent.y = 30;
  57.  
  58.   WinEraseRectangle(&r, 0);
  59.   r.topLeft.y = 30, r.extent.y = 15;
  60.  
  61.   FileTell(fd, &total, NULL);
  62.   if( destruct )
  63.     FileControl(fileOpDestructiveReadMode, fd, NULL, NULL);
  64.  
  65.   memset(&head, 0, sizeof(head));
  66.   fread(&head, sizeof(head), 1, fd);
  67.  
  68.   count = sizeof(head);
  69.  
  70.   r.extent.x = 160 * count / total;
  71.   WinDrawRectangle(&r, 0);
  72.  
  73.   WinDrawChars(head.name, strlen(head.name), 0, 15);
  74.  
  75.   if( DmCreateDatabase(cardno, head.name, head.crea, head.type,
  76.                (head.attr & dmHdrAttrResDB)) ) {
  77.     lid = DmFindDatabase(cardno, head.name);
  78.  
  79.     /////////////////CONFIRM
  80.  
  81.     if (lid)
  82.       DmDeleteDatabase(cardno, lid);
  83.     DmCreateDatabase(cardno, head.name, head.crea, head.type,
  84.              (head.attr & dmHdrAttrResDB)) ;
  85.   }
  86.  
  87.   lid = DmFindDatabase(cardno, head.name);
  88.  
  89.   if (!lid) {
  90.     fclose(fd);
  91.     return 1;
  92.   }
  93.  
  94.   //////////FIXME - set this at the end if true;
  95.  
  96.   head.attr &= ~dmHdrAttrReadOnly;
  97.   DmSetDatabaseInfo(cardno, lid, NULL, &head.attr, &head.vers, &head.cr,
  98.                     &head.md, &head.bkt, &head.mn, NULL, NULL, NULL, NULL);
  99.  
  100.   WinDrawChars("/", 1, 150, 0);
  101.  
  102.   {
  103.     char buf[256];
  104.  
  105.   tfd = FileOpen(0, "MAKEDBtemporary", 'DATA', 'BOXR', fileModeReadWrite, NULL);
  106.  
  107.   if (head.attr & dmHdrAttrResDB) {
  108.  
  109.     ssz = sizeof(struct rsrcdbent) * head.nrecs;
  110.     count += ssz;
  111.  
  112.     while( ssz ) {
  113.       i = ssz > 256 ? 256 : ssz;
  114.       fread(buf, 1, i , fd);
  115.       fwrite(buf, 1, i, tfd);
  116.       ssz -= i;
  117.     }
  118.  
  119.     FileControl(fileOpDestructiveReadMode, tfd, NULL, NULL);
  120.     fread(&rsrcent,1,sizeof(rsrcent),tfd);
  121.  
  122.     ofst = rsrcent.ofst;
  123.  
  124.  
  125.   } else {
  126.  
  127.  
  128.     ssz = sizeof(struct normdbent) * head.nrecs;
  129.     count += ssz;
  130.  
  131.     while( ssz ) {
  132.       i = ssz > 256 ? 256 : ssz;
  133.       fread(buf, 1, i , fd);
  134.       fwrite(buf, 1, i, tfd);
  135.       ssz -= i;
  136.     }
  137.  
  138.  
  139.     FileControl(fileOpDestructiveReadMode, tfd, NULL, NULL);
  140.     fread(&dataent,1,sizeof(dataent),tfd);
  141.  
  142.     ofst = dataent.ofst;
  143.  
  144.   }
  145.  
  146.   }
  147.  
  148.   r.extent.x = 160 * count / total;
  149.   WinDrawRectangle(&r, 0);
  150.  
  151.  
  152.   db = DmOpenDatabase(cardno, lid, dmModeReadWrite);
  153.  
  154.   asz = 0;
  155.   ssz = 0;
  156.   if (head.app)
  157.     asz = (head.sort ? head.sort : ofst) - head.app;
  158.   if (head.sort)
  159.     ssz = ofst - head.sort;
  160.  
  161. #define dmfread(bufP, objSize, numObj, stream) \
  162. FileDmRead((stream), bufP, 0, (objSize), (numObj), NULL)
  163.  
  164.   //    fread(buf, 2, 1, fd);
  165.  
  166.  
  167.   WinDrawChars("\\", 1, 155, 0);
  168.  
  169.   if (asz) {
  170.     while (count < head.app)
  171.       count += fread(buf, 1 , head.app - count > 8 ? 8 : head.app - count, fd);
  172.     ap = DmNewHandle(db, asz);
  173.     count += dmfread(MemHandleLock(ap), 1, asz, fd);
  174.     MemHandleUnlock(ap);
  175.     aiid = MemHandleToLocalID(ap);
  176.     DmSetDatabaseInfo(cardno, lid, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  177.                       &aiid, NULL, NULL, NULL);
  178.  
  179.   }
  180.  
  181.   if (ssz) {
  182.     while (count < head.sort)
  183.       count += fread(buf, 1, head.sort - count > 8 ? 8 : head.sort - count, fd);
  184.     ap = DmNewHandle(db, ssz);
  185.     count += dmfread(MemHandleLock(ap), 1, ssz, fd);
  186.     MemHandleUnlock(ap);
  187.     siid = MemHandleToLocalID(ap);
  188.     DmSetDatabaseInfo(cardno, lid, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  189.                       NULL, &siid, NULL, NULL);
  190.   }
  191.  
  192.   r.extent.x = 160 * count / total;
  193.   WinDrawRectangle(&r, 0);
  194.  
  195.   if (head.attr & dmHdrAttrResDB) {
  196.     for (i = 0; i < head.nrecs; i++) {
  197.  
  198.       if( i < head.nrecs - 1 )
  199.     fread(&rsrcnxt,1,sizeof(struct rsrcdbent),tfd);
  200.       else
  201.     rsrcnxt.ofst = total;
  202.       ssz = rsrcnxt.ofst - rsrcent.ofst;
  203.  
  204.       ap = DmNewResource(db, rsrcent.rsrc, rsrcent.rsid, ssz);
  205.       while (count < rsrcent.ofst)
  206.     count += fread(buf, 1, rsrcent.ofst - count > 8 ? 8 : rsrcent.ofst - count, fd);
  207.       count += dmfread(MemHandleLock(ap), 1, ssz, fd);
  208.       MemHandleUnlock(ap);
  209.       DmReleaseResource(ap);
  210.  
  211.       rsrcent = rsrcnxt;
  212.  
  213.       r.extent.x = 160 * count / total;
  214.       WinDrawRectangle(&r, 0);
  215.  
  216.     }
  217.  
  218.   } else {
  219.     for (i = 0; i < head.nrecs; i++) {
  220.  
  221.       if( i < head.nrecs - 1 )
  222.     fread(&datanxt,1,sizeof(struct normdbent),tfd);
  223.       else
  224.     datanxt.ofst = total;
  225.       ssz = datanxt.ofst - dataent.ofst;
  226.  
  227.       num = 0xffff;
  228.       ap = DmNewRecord(db, &num, ssz);
  229.       while (count < dataent.ofst)
  230.     count += fread(buf, 1, dataent.ofst - count > 8 ? 8 : dataent.ofst - count, fd);
  231.       count += dmfread(MemHandleLock(ap), 1, ssz, fd);
  232.       MemHandleUnlock(ap);
  233.  
  234.       attr = dataent.uid >> 24;
  235.       uid = dataent.uid & 0xffffffUL;
  236.       DmSetRecordInfo(db, num, &attr, &uid);
  237.       DmReleaseRecord(db, num, false);
  238.  
  239.       rsrcent = rsrcnxt;
  240.  
  241.       r.extent.x = 160 * count / total;
  242.       WinDrawRectangle(&r, 0);
  243.  
  244.     }
  245.  
  246.   }
  247.  
  248.   DmCloseDatabase(db);
  249.   fclose(tfd);
  250.   unlink("MAKEDBtemporary");
  251.   return 0;
  252.  
  253. }
  254.